// import {
//   Body,
//   ClassSerializerInterceptor,
//   Controller,
//   Get,
//   HttpStatus,
//   Param,
//   Patch,
//   Query,
//   UseGuards,
//   UseInterceptors,
// } from '@nestjs/common';
// import {
//   ApiBearerAuth,
//   ApiOperation,
//   ApiResponse,
//   ApiTags,
// } from '@nestjs/swagger';

// // import { ROLE } from '../../auth/constants/role.constant';
// // import { Roles } from '../../auth/decorators/role.decorator';
// import { JwtAuthGuard } from '../../auth/guards/jwt-auth.guard';
// // import { RolesGuard } from '../../auth/guards/roles.guard';
// // import {
// //   BaseApiErrorResponse,
// //   BaseApiResponse,
// //   SwaggerBaseApiResponse,
// // } from '../../shared/dtos/base-api-response.dto';
// // import { PaginationParamsDto } from '../../shared/dtos/pagination-params.dto';
// // import { AppLogger } from '../../shared/logger/logger.service';
// // import { ReqContext } from '../../shared/request-context/req-context.decorator';
// // import { RequestContext } from '../../shared/request-context/request-context.dto';
// import { UserOutput } from '../dtos/user-output.dto';
// import { UpdateUserInput } from '../dtos/user-update-input.dto';
// import { UserService } from '../services/user.service';
// import {
//   SwaggerBaseApiResponse,
//   BaseApiErrorResponse,
//   BaseApiResponse,
// } from 'src/shared/dtos/base-api-response.dto';
// import { PaginationParamsDto } from 'src/shared/dtos/pagination-params.dto';
// import { ReqContext } from 'src/shared/request-context/req-context.decorator';
// import { RequestContext } from 'src/shared/request-context/request-context.dto';
// import { Public } from 'src/modules/auth/decorators/public.decorator';

// @ApiTags('users')
// @Controller('users')
// export class UserController {
//   constructor(
//     private readonly userService: UserService,
//     // private readonly logger: AppLogger,
//   ) {
//     // this.logger.setContext(UserController.name);
//   }
//   // @UseGuards(JwtAuthGuard)
//   @Public()
//   @ApiBearerAuth()
//   @UseInterceptors(ClassSerializerInterceptor)
//   @Get('me')
//   @ApiOperation({
//     summary: 'Get user me API',
//   })
//   @ApiResponse({
//     status: HttpStatus.OK,
//     type: SwaggerBaseApiResponse(UserOutput),
//   })
//   @ApiResponse({
//     status: HttpStatus.UNAUTHORIZED,
//     type: BaseApiErrorResponse,
//   })
//   async getMyProfile(
//     @ReqContext() ctx: RequestContext,
//   ): Promise<BaseApiResponse<UserOutput>> {
//     // this.logger.log(ctx, `${this.getMyProfile.name} was called`);

//     const user = await this.userService.findById(ctx, ctx.user.id);
//     return { data: user, meta: {} };
//   }

//   @UseInterceptors(ClassSerializerInterceptor)
//   @Get()
//   @ApiOperation({
//     summary: 'Get users as a list API',
//   })
//   @ApiResponse({
//     status: HttpStatus.OK,
//     type: SwaggerBaseApiResponse([UserOutput]),
//   })
//   @ApiResponse({
//     status: HttpStatus.UNAUTHORIZED,
//     type: BaseApiErrorResponse,
//   })
//   // @UseGuards(JwtAuthGuard, RolesGuard)
//   @UseGuards(JwtAuthGuard)
//   // @Roles(ROLE.ADMIN, ROLE.USER)
//   async getUsers(
//     @ReqContext() ctx: RequestContext,
//     @Query() query: PaginationParamsDto,
//   ): Promise<BaseApiResponse<UserOutput[]>> {
//     // this.logger.log(ctx, `${this.getUsers.name} was called`);

//     const { users, count } = await this.userService.getUsers(
//       ctx,
//       query.limit,
//       query.offset,
//     );

//     return { data: users, meta: { count } };
//   }

//   // TODO: ADD RoleGuard
//   // NOTE : This can be made a admin only endpoint. For normal users they can use GET /me
//   @UseInterceptors(ClassSerializerInterceptor)
//   @Get(':id')
//   @ApiOperation({
//     summary: 'Get user by id API',
//   })
//   @ApiResponse({
//     status: HttpStatus.OK,
//     type: SwaggerBaseApiResponse(UserOutput),
//   })
//   @ApiResponse({
//     status: HttpStatus.NOT_FOUND,
//     type: BaseApiErrorResponse,
//   })
//   async getUser(
//     @ReqContext() ctx: RequestContext,
//     @Param('id') id: number,
//   ): Promise<BaseApiResponse<UserOutput>> {
//     // this.logger.log(ctx, `${this.getUser.name} was called`);

//     const user = await this.userService.getUserById(ctx, id);
//     return { data: user, meta: {} };
//   }

//   // TODO: ADD RoleGuard
//   // NOTE : This can be made a admin only endpoint. For normal users they can use PATCH /me
//   @Patch(':id')
//   @ApiOperation({
//     summary: 'Update user API',
//   })
//   @ApiResponse({
//     status: HttpStatus.OK,
//     type: SwaggerBaseApiResponse(UserOutput),
//   })
//   @ApiResponse({
//     status: HttpStatus.NOT_FOUND,
//     type: BaseApiErrorResponse,
//   })
//   @UseInterceptors(ClassSerializerInterceptor)
//   async updateUser(
//     @ReqContext() ctx: RequestContext,
//     @Param('id') userId: number,
//     @Body() input: UpdateUserInput,
//   ): Promise<BaseApiResponse<UserOutput>> {
//     // this.logger.log(ctx, `${this.updateUser.name} was called`);

//     const user = await this.userService.updateUser(ctx, userId, input);
//     return { data: user, meta: {} };
//   }
// }
